﻿
### 编辑页面功能需求文档

#### 一、全局变量定义
typedef struct {
    PAGE_BASE_OBJ* Pbo;                                     // 继承的页面基础对象结构体 必须要放在最前面
    lv_obj_t* ViewText[4];                                  // 视图对象指针，本页全局使用 关闭页面时记得摧毁
    int currentPage;                                        // 0: 主菜单页, 1: WIFI页, 2: 延时调节页, 3: 喇叭设置页, 4: 调试模式页面, 5: 第三层页面（修改页面）
    int scrollOffset;                                       // 当前页面的滚动偏移量
    int selectedIndex;                                      // 当前选中的行索引（不包括页头）
    int record2ndIndex;                                     // 记录第二层的选中索引
    int record2ndPage;                                      // 记录进入第三层页面之前的第二层页面的currentPage值
    int thirdValue;                                         // 第三层页面的数值变量
    lv_obj_t* Container;                                    // 反色背景对象
    lv_style_t Style;
} PAGE_GLOBAL_VARIABLE;

#### 二、核心功能模块

##### 1. 文本显示系统
- 显示规则：
- tabTextPosi 数组定义了文字在页面中的显示位置，具体如下：​
  - tabTextPosi[0]：对应页头行，位置为{ 0, 0}
  - tabTextPosi[1]：对应第三行，位置为{ 0, 24}
  - tabTextPosi[2]：对应第二行，位置为{ 0, 38}
  - tabTextPosi[3]：对应第一行，位置为{ 0, 52}

- 光标控制：
  - 上翻键（IR_MENU_UP）：光标上移一行，更新背景显示的颜色和位置，显示对应的文字
  - 下翻键（IR_MENU_DN）：光标下移一行，更新背景显示的颜色和位置，显示对应的文字
- 实时更新：每次光标移动后自动更新ViewText显示和背景显示

##### 2. 信息修改系统
- 只有在第三层页面时，才可以修改相对应的信息
- 修改操作：
  - 左翻键（IR_MENU_LEFT）：如果是修改数值时，减小数值。
  - 右翻键（IR_MENU_RIGHT）：如果是修改数值时，加大数值。
  - 实时更新ViewText显示

##### 3. 功能选择系统
- 四大功能：
  | 索引 | 名称       | 功能描述                          |
  |------|------------|-----------------------------------|
  | 0    | 网络设置   | 修改WIFI网络信息                  |
  | 1    | 延时调节   | 修改各声道延时                    |
  | 2    | 喇叭设置   | 修改各个喇叭的状态                |
  | 3    | 调试模式   | 设置调试的方式和设置端口          |

- 交互逻辑：
  - 确定键（IR_MENU_CTRL）进入功能选择模式
  - 上下键选择功能（白色背景+黑色文字）
  - 功能显示规则，从第二个开始：
    static const int tabMenuText[] = {STR12_MENU, STR12_WIFI, STR12_DELAY_ADJ, STR12_SPEAKER_SET, STR12_DEBUG_MODE, STR12_SET_BACK};

#### 三、视觉交互规范
1. 光标反色显示：
   - 每次切换可见性（背景显示白色）
   - 使用更换背景颜色实现：DisplaySetStyleColor(pgvar->Container, &pgvar->Style, lv_color_white());

2. 样式配置：
   - 样式的大小：lv_obj_set_size(pgvar->Container, 128, 14);
   - 样式的颜色：DisplaySetStyleColor(pgvar->Container, &pgvar->Style, lv_color_white());

#### 四、关键函数实现
1. 显示更新函数：
   static void updateDisplay() {
       // 页头文字显示
        LvglString12(pgvar->ViewText[0], RTCOLOR_ALIGN_X | RTCOLOR_WHITE, currentArray[0], 0);
       
       // 其余三行文字的显示
        int displayIndex = 1;
        for (int i = startIndex; i < endIndex; i++) {
            LvglString12(pgvar->ViewText[displayIndex], RTCOLOR_WHITE, currentArray[i], 0);
            if (displayIndex - 1 == pgvar->selectedIndex) {
                lv_obj_set_style_text_color(pgvar->ViewText[displayIndex], lv_color_black(), LV_PART_MAIN);
                setBgposi(displayIndex - 1);
            }
            else {
                lv_obj_set_style_text_color(pgvar->ViewText[displayIndex], lv_color_white(), LV_PART_MAIN);
            }
            displayIndex++;
        }
   }

2. 功能选择反色背景容器的位置：
    static void setBgposi(int value) {
        switch (value) {
        case 0:
            lv_obj_set_pos(pgvar->Container, 0, 24);
            break;
        case 1:
            lv_obj_set_pos(pgvar->Container, 0, 38);
            break;
        default:
            lv_obj_set_pos(pgvar->Container, 0, 52);
            break;
        }
    }

#### 五、代码规范要求
1. 命名规范：
   - 全局变量：PascalCase（如PageGlobalVariable）
   - 局部变量：camelCase（如currentMode）
   - 函数：camelCase（如updateDisplay）

2. 内存管理：
   - 使用TxtUtils.h中的字符串操作函数
   - 在MenuSetPageClose中释放所有LVGL对象

3. 注释规范：
   - 行尾注释，制表符对齐（// 注释内容）
   - 关键逻辑添加详细注释

4. 样式管理：
   - 使用DisplaySetStyleColor统一设置样式
   - 优先使用LVGL 9.3新特性

#### 六、交互流程图
graph TD
    A[字符编辑模式] -->|确定键| B[功能选择模式]
    B -->|左右键| C[选择功能]
    B -->|上翻键| A
    C -->|确定键| D[执行功能]
    D -->|返回/保存| E[退出页面]

####  注意

    静态函数需要注意先后次序
    不能出现警告 调用TxtUtils.h时,如果是const char*的参数需要强制转换为(char*)
    需要完整的代码 严格按照所有的要求来编写 可以慢 但不要有漏

后面是投喂的文件
template_DemoPage.c PageBase.h TxtUtils.h LvglUtils.c
